﻿using System.Linq;

namespace Central.Linq {

	/// <summary>
	/// Расширение класса SortManager
	/// </summary>
	public static class SortManagerExtensions {

		/// <summary>
		/// Изменение сортировки на основе группировки
		/// </summary>
		/// <param name="sorters">коллекция сортировки</param>
		/// <param name="groups">коллекция группировки</param>
		/// <returns>новая коллекцию сортировки</returns>
		public static SortManager ChangeSortersByGroups(this SortManager sorters, GroupManager groups) {
			return ChangeSortersByGroups(sorters, groups, null);
		}

		/// <summary>
		/// Изменение сортировки на основе группировки
		/// </summary>
		/// <param name="sorters">коллекция сортировки</param>
		/// <param name="groups">коллекция группировки</param>
		/// <param name="fields">коллекция полей выборки</param>
		/// <returns>новая коллекцию сортировки</returns>
		public static SortManager ChangeSortersByGroups(this SortManager sorters, GroupManager groups, FieldManager fields) {
			if (groups != null && groups.Count > 0) {
				if (sorters == null)
					sorters = new SortManager();

				if (sorters.Count > 0) {
					SortManager newSorters = new SortManager();
					// Включаем в коллекцию сортировки только те поля, которые участвуют в группировке или в подсчете агрегирующих функций
					foreach (SortDefinition sorter in sorters.SortDefinitions) {
						if ((groups.GroupFields.Contains(sorter.Name) || (groups.AggregateFields != null && groups.AggregateFields.Select(o => o.Field).Contains(sorter.Name))))
							newSorters.Add(sorter);
					}

					sorters = newSorters;
				}

				// если сортировка не задана
				if (sorters.Count == 0) {
					// включаем в коллекцию сортировки поля, которые участвуют в группировке
					if (fields != null && fields.Count > 0) {
						foreach (string groupField in groups.GroupFields) {
							if (fields.FieldDefinitions.Select(o => o.Name).Contains(groupField))
								sorters.Add(new SortDefinition(groupField));
						}
					}
					else {
						foreach (string groupField in groups.GroupFields) {
							sorters.Add(new SortDefinition(groupField));
						}
					}
				}
			}
			return sorters;
		}
	}
}